from math import hypot
'''
标题：模拟数值类型
体验：__add__, __abs__, __repr__, __mul__

1.2.1 加，绝对值，介绍，乘法

1.2.2 __repr__()，字符串表示形式，实现该方法可以打印实例。
    str.format 与 % 也是使用了此方法

1.2.3 __add__(), __mul__()

1.2.4 __bool__()：bool(x) 调用该方法，如果不存在x.__bool__()，则尝试调用x.__len__()
    我们这里使用自定义abs()模作为bool的结果， 模为0 则False ,否则True。
'''


class Vector:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    # 用来做“自我介绍”:一般返回当前对象的“类名+object at+内存地址”
    def __repr__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)

    # hypot 三角形斜边函数
    def __abs__(self):
        return hypot(self.x, self.y)

    # abs 绝对值函数
    def __bool__(self):
        return bool(abs(self))

    def __add__(self, other):
        x = self.x + other.x
        y = self.y + other.y
        return Vector(x, y)

    # 向量乘法
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)


if __name__ == '__main__':
    v1 = Vector(2, 3)
    v2 = Vector(3, 4)
    # 不用repr print会返回一个<对象 object 0x423>
    print(v1)  # __repr__()
    print(v1 * 3)  # __mul__()
    print(abs(v1))  # __abs__()
    print(v1 + v2)
    print(bool(v1))



